#include <iostream>
using namespace std;

// 构造函数的分类及调用
// 分类
// 按照参数分类  无参构造（默认构造） 和 有参构造
// 按照类型分类  普通构造函数 和 拷贝构造函数
class Person
{
public:
    int age;

    // 构造函数
    Person()
    {
        cout << "Person 无参构造函数调用" << endl;
    }

    Person(int a)
    {
        age = a;
        cout << "Person 有参构造函数调用" << endl;
    }

    // 拷贝构造函数
    Person(const Person &p)
    {
        // 将传入的人身上所有属性，拷贝到我身上
        age = p.age;
        cout << "Person 拷贝构造函数调用" << endl;
    }

    // 析构函数
    ~Person()
    {
        cout << "Person 析构函数调用" << endl;
    }
};

// 调用
void test1()
{
    // 1、括号法
    Person p; // 注意：默认构造函数的调用,不要加()
    // Person p(); // 编译器会认为此为函数声明，不是创建对象

    Person p2(10); // 有参构造
    Person p3(p2); // 拷贝构造

    cout << "p2的年龄为：" << p2.age << endl;
    cout << "p3的年龄为：" << p3.age << endl;

    // 2、显示法
    Person p4 = Person();
    Person p5 = Person(10); // 有参构造
    Person p6 = Person(p5); // 拷贝构造

    Person(20); // 匿名对象  特点：当前行结束后，系统会立刻回收对象
    cout << "-------------------" << endl;

    // 不要利用拷贝函数来 初始化匿名对象
    // Person(p2);  // 编译器会认为 Person(p2) == Person p2;

    // 3、隐式转换法
    Person p7 = 10; // 相当于 Person p7(10);
    Person p8 = p2; // 拷贝构造
}
int main()
{
    test1();

    return 0;
}